/**
 * 执行npm run 执行的脚本
 * */

import * as fs from "fs";
import * as path from "path";

// 获取根目录的路径
const rootPath = path.join(__dirname, "../../");
// 获取根目录的目录名
const rootDir = fs.readdirSync(rootPath);

/**
 * 获取脚本参数，处理 npm脚本 传给 node脚本 的参数，处理为一个对象
 * { env:"development" }
 * */
const scriptParams: ScriptParams = process.argv
  .filter((e) => /.+=.+/g.test(e))
  .reduce((a, b) => {
    a[b.split("=")[0]] = b.split("=")[1];
    return a;
  }, {});

/**
 * 脚本方法类文件
 * 可定义多个方法
 * */
export class RunScriptFn {
  // 创建并写入env文件，如果已经存在则删除，如果传递又env参数则创建并写入
  static createEnv(env: Env = scriptParams.env) {
    if (rootDir.includes(".env")) fs.unlinkSync(path.join(rootPath, ".env"));
    if (env) fs.writeFileSync(path.join(rootPath, ".env"), `NODE_ENV=${env}`);
  }
}

// 当执行node脚本的时候，自动执行此方法
(async function main() {
  // 通过fn参数来决定执行RunScriptFn类中的方法，不传仅执行createEnv方法
  const fns = scriptParams?.fn?.split(",") || ["createEnv"];
  for (const fn of fns) {
    await RunScriptFn[fn]();
  }
})();

// node脚本参数
interface ScriptParams {
  // 设置的环境变量
  env?: Env;
  // 执行的Fn类下的方法，多个用英文逗号分割
  fn?: string;
}

// 环境变量
type Env = "dev" | "prod" | string;
